/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.atp.agencia.modelo;

import br.com.atp.agencia.util.DateUtil;
import br.com.atp.agencia.util.PropriedadesSistema;
import java.util.Date;

/**
 *
 * @author Afonso
 */
public abstract class Aluguel {

    private static Double valorDiaria;
    private Date entrada;
    private Date saida;
    private Locatario locatario;
    private boolean ocupado;
    private int numDiarias;
    protected int numPessoas;

    public Aluguel() {
        setOcupado(false);
    }

    public int getNumPessoas() {
        return numPessoas;
    }

    /**
     *
     * @param numPessoas
     */
    public void setNumPessoas(int numPessoas) throws Exception {
        if (PropriedadesSistema.getLimitePessoasQuarto() < numPessoas) {
            throw new Exception("Numero de pessoas ecedido");
        } else {
            this.numPessoas = numPessoas;
        }
    }

    public static Double getValorDiaria() {
        return valorDiaria;
    }

    public static void setValorDiaria(Double valorDiaria) {
        Aluguel.valorDiaria = valorDiaria;
    }

    public Date getEntrada() {
        return entrada;
    }

    public void setEntrada(Date entrada) {
        this.entrada = entrada;
    }

    public Date getSaida() {
        return saida;
    }

    public void setSaida(Date saida) throws Exception {
        int aux = 0;//contador
        if (this.entrada == null) {
            throw new Exception("Data de entrada não informada");
        } else {
            this.saida = saida;
            aux = DateUtil.diff(entrada, saida);// Faz o calculo da diferença.
            if (DateUtil.isAposMeioDia(saida)) {// Conforme a regra, caso saia
                aux++;                          // após o meio dia, conte mais 
            }                                   // uma diaria 
            if (!DateUtil.isAposMeioDia(entrada)) {// Conforme a regra, caso saia
                aux++;                          // após o meio dia, conte mais 
            }                                   // uma diaria 
            setNumDiarias(aux);
        }
    }

    public Locatario getLocatario() {
        return locatario;
    }

    public void setLocatario(Locatario locatario) throws Exception {
        if (!isOcupado()) {
            this.locatario = locatario;
            setOcupado(true);
        } else {
            throw new Exception("Quarto Ocupado");
        }
    }

    public void removeLocatario() {
        this.locatario = null;
        this.entrada = null;
        this.saida = null;
        this.numDiarias = 0;

        setOcupado(false);
    }

    public boolean isOcupado() {
        return ocupado;
    }

    public void setOcupado(boolean ocupado) {
        this.ocupado = ocupado;
    }

    public int getNumDiarias() {
        return numDiarias;
    }

    private void setNumDiarias(int numDiarias) {
        this.numDiarias = numDiarias;
    }

    public String recibo() throws Exception {
        String recibo = null;
        if (isOcupado()) {

            String linha = "=================================================\n";
            linha += locatario.toString() + "\n";
            linha += "Entrada: " + DateUtil.getStringFromDate(entrada, DateUtil.formatoBR) + "\n";
            linha += "Saida: " + DateUtil.getStringFromDate(saida, DateUtil.formatoBR) + "\n";
            linha += "Número de diárias: " + numDiarias +"\n";
            linha += "Total devido: " + getTotalDevido() + "\n";
            linha += "=================================================\n";
            recibo = linha;
            return recibo;
        } else {
            throw new Exception("Recibo invalido");
        }
    }

    public abstract Double getTotalDevido();
}
